Skip to content

fix(desktop): bind duplicate mention selections to exact recipients - #7133

Merged
loganj merged 9 commits into
mainfrom
fix/mention-recipients-split
Sep 4, 2026
Merged

fix(desktop): bind duplicate mention selections to exact recipients#7133
loganj merged 9 commits into
mainfrom
fix/mention-recipients-split

Conversation

@loganj

@loganj loganj commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Summary

Selecting two people or agents named Scout could replace the first recipient with the second even though the message still looked right. This binds each selection to its exact identity: the first keeps @Scout, and a conflicting selection gets @Scout (<full public key>). Removing one no longer removes or redirects the other.

  • Reuse the existing @ suggestion list; team selection and automatic agent addressing reserve and reuse distinct labels too. Typing an ambiguous name manually shows an instruction to use the picker and preserves the draft without publishing—in chat, edits and standalone forums.
  • Share literal mention matching across recipient extraction, removal, display and editing so a shorter name cannot claim another recipient's longer or qualified label.
  • Rebuild authored references when a message is edited, and use the latest authorized snapshot when reopening or forwarding. Rendering/editing can recover qualified identities only from the message's recorded references, not from a key typed into its body. Unresolvable historical names remain literal rather than guessed recipients.
  • Wrap full-key labels within narrow/zoomed layouts while keeping their complete accessible label and ordinary mention icons. Edit activation waits for the action menu's focus cleanup before focusing the editor.

Related issue

Targets main; mention spacing (#7128) is already merged. Split from #7114. This is independent of the #7124#7125 remote-invitation stack and does not expand agent eligibility or invitation permissions. The separate Enter-selection suffix issue remains tracked in #7253.

Testing

The desktop unit suite and focused mock-Chromium checks passed on the published integration candidate, including pending-paste selection, edit/forwarding, copy and narrow-layout cases; formatting, types and frontend builds passed. On 0b3b18c0, 64 focused trust/paste/selection unit tests and six mock-Chromium tests passed with zero browser retries, including actual timeline chip copy → fresh channel paste → send and mismatched-key rejection; TypeScript, changed-file Biome and an isolated E2E build passed. The broader browser run had copy failures before the focused repairs and is not claimed as wholly green. See live CI for current-head results. No full local just ci pass, native/live-relay or cross-browser validation is claimed.

To try it: select two same-name recipients, remove one, send, then edit/reopen and forward; only the intended identities should remain. Type an ambiguous name without choosing a suggestion and check that sending retains the draft with an error. Inspect full-key labels in a narrow window at 150% text size, and open Edit and type immediately.

Ambiguous mention keeps the chat draft

Full-key label in a narrow, zoomed composer

Earlier mock-browser captures, not current-head runtime proof. No new before-state capture; screenshots alone do not prove recipient delivery.

Clipboard trust: generated full-key-qualified mentions now retain their exact recipient after copy/paste when the full key matches the clipboard record and community directory/profile state independently vouches for the base alias, including numeric collision suffixes. A qualifier alone does not establish trust. Arbitrary historical labels still cannot always be reconstructed.

@loganj

This comment has been minimized.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review verdict: request changes

Reviewed base 4fe451d9c251af59c34a0a890d38499912f7e3da through exact live head 30545075a876136467c07d82abac83ad1904df23. The core exact-recipient binding is a strong fail-closed improvement, but three PR-caused defects remain.

1. Deleted ambiguous recipients survive replacement edits and can be notified by “Send to channel”

buildEditMentionState puts tagged identities it cannot bind into unresolvedMentionPubkeys (desktop/src/features/messages/lib/draftMentionRefs.ts:54-94). submitMessageEdit then copies that original list unchanged into the replacement draft and always emits it as mention reference tags (desktop/src/features/messages/ui/submitMessageEdit.ts:79-86,127-135). Consequently, replacing an ambiguous historical @Scout with @Alice or plain text retains both deleted Scout identities in the edit snapshot.

This is behaviorally significant: after applying the production edit overlay, getSendToChannelSemantics treats the snapshot's mention tags as authoritative (desktop/src/features/messages/lib/sendToChannelSemantics.ts:40-53) and selects the old Scouts from the overlaid p tags instead of Alice. A production-helper repro at this head produced saved refs A+B, notifying edit key C, and forwarded recipients A+B. Existing replacement coverage (submitMessageEdit.test.mjs:163-197) checks only revalidation/save pubkeys, not emitted refs or forwarding.

Author action: rebuild/filter unresolved identities against occurrences still owned by the edited content. Add a production-seam regression for ambiguous historical @Scout@Alice and → plain text, apply the edit overlay, and assert both emitted refs and send-to-channel recipients. The regression should fail if the filtering is removed.

2. The new exact-recipient representation creates an unbounded, non-wrapping chip

Duplicate selection deliberately authors Display Name (<64 hex characters>) (desktop/src/features/messages/lib/extractMentionPubkeys.ts:34-40). Rendered mentions use InlineChip without the repository's wrapping class (desktop/src/shared/ui/markdown/MarkdownMention.tsx:29-37), while mention chips are inline-flex and only .wrapping-inline-chip enables overflow-wrap:anywhere (desktop/src/shared/styles/globals/markdown.css:67-101). In a narrow pane or at increased text zoom, this new single-token label can overflow/clip the conversation; in the composer it also exposes a long implementation identifier that overwhelms the sentence.

Author action: preserve exact identity for routing while making both composer and rendered presentation bounded and break-safe, with an accessible disambiguation affordance. At minimum apply the established wrapping behavior; preferably show a concise distinguishing fragment while retaining the full identity in profile/accessibility details. Add narrow-pane and increased-zoom coverage for composer, sent message, and edit reopen.

3. The new edit/reopen E2E is focus-flaky

desktop/tests/e2e/mention-recipients.spec.ts:229-236 installs a DOM selection and immediately calls page.keyboard.type() without focusing message-input. Exact-head execution observed the file at 8 pass / 1 fail; repeating the case yielded 2 pass / 1 fail with unchanged editor text at line 238. The screenshot showed edit mode open but no mutation, consistent with keyboard input going nowhere.

Author action: focus the editor after setting the range (or use a helper that establishes both focus and selection), assert focus/caret before typing, and repeat the case enough times to demonstrate stability.

Verification and confidence gaps

  • Exact-head full desktop unit suite: 5,828/5,828 passed with clean tree and matching start/end SHA.
  • Focused changed-path suite: 173/173 passed; exact-head typecheck/check and build:e2e passed.
  • GitHub checks are green/skipped as path-selected and merge state is CLEAN. Current coverage does not catch finding 1, and green E2E does not disprove finding 3's reproduced intermittent actuation failure.
  • No live native/Tauri + relay journey was performed. That is a reviewer/release confidence gap, not additional author rework; the PR correctly characterizes its browser evidence as mock-backed.

— :bot: Jude’s code review agent

@loganj

This comment has been minimized.

@loganj

loganj commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator Author

🤖

Addressing all three findings in review 5084816048 at 0b0a5e9d81c16e9b8020407b2bcb442ac05302b3, retaining the original #7128 base:

  1. Deleted ambiguous recipients / forward: snapshotUnresolvedEditMentionPubkeys now retains only collectively owned historical occurrences; mentionIdentityTags gives the latest snapshot precedence over original p-tags. submitMessageEdit adds new recipients only after revalidation. Tests cover ambiguous Scout → Alice/plain text, same-label replacement, missing profiles, absent-roster Scout(A/B) versus Scout Jones(C/D), and mixed resolved Scout(A) versus ambiguous Scout Jones(C/D). Deleted A/B do not survive save/authorized overlay/reopen/second save/forward. Historical ties remain non-binding. Latest authorized snapshot still intentionally supplies forward recipients without original-p intersection; annotated automatic addresses remain delivery-gated. The original 15-pass/4-fail contrast and extraction-only 23-pass/1-fail mutation are retained; final 24/24 authority and independent 12/12 probes pass. Two final real mock-UI menu Edit/save/reopen/Send-to-channel cases assert C/D-only command arguments.

  2. Unbounded full-key chips: composer decorations now use anywhere wrapping and literal prefixes without overlapping pseudo-icons; rendered MarkdownMention uses the existing wrapping class with complete title/aria-label. The full identity remains on the wire and in editable text, not truncated. Six preserved 800×900 frames cover composer/sent/reopen at 100% and 150%, with bounding assertions. This meets the minimum break-safe request, not the preferred concise-key redesign. Scope is all composer decorations/rendered mention chips. Preserved captures are consolidated in the body with provenance.

  3. Edit/reopen focus: the test focuses and asserts caret ownership before typing. The underlying Radix lifecycle race is also fixed: pending Edit runs at onCloseAutoFocus, after exit, and only Edit suppresses trigger restoration. Held real exit + immediate typing/Escape coverage and causal mutation evidence support the fix; unchanged menu evidence is 16/16 browser and 60/60 zero-retry repeats, not rerun for R1. Reopening during a held exit remains inconclusive, not a green coverage claim.

The exact committed repair SHA-256 is ffd405c777349fedb4ebe1141254d107d14a24f169d3893a0335897e34573ec2; full base-relative patch c53854ba2aea54382769d517d8a0fd96780f9c82362b39e6919e4ecaf1a77c08. All approved source blobs match. Final Desktop 5861/5861, focused 102/102, authority 24/24, check/typecheck/E2E build pass; independent 12/12 probes and normal production OSS build/scan pass. Full old browser failure history and warnings remain disclosed in the body. No full local just-ci, native/live-relay/signature, cross-browser or whole-app accessibility certification is claimed.

No inline review threads exist to resolve. The formal CHANGES_REQUESTED review is retained for exact-head reassessment, not dismissed. @jedwards27 — please rerun A Team review for this exact head. Separate composer F1 is tracked in #7253, remains unresolved/nonblocking for cloud, and must not be conflated with this menu-exit focus repair. Publication is not merge/security permission.

@loganj
loganj requested a review from jedwards27 September 2, 2026 18:19

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review verdict: request changes

Re-reviewed base 4fe451d9c251af59c34a0a890d38499912f7e3da through exact live head 0b0a5e9d81c16e9b8020407b2bcb442ac05302b3. The prior recipient-retention, wrapping, and editor-focus blockers are repaired, but this head introduces one PR-caused product regression and leaves a required smoke gate red.

Ordinary composer mentions lose their identity icon

desktop/src/shared/styles/globals/composer.css:282-288 applies padding-inline: 0 and ::before { display: none } to every .mention-chip[spellcheck="false"], rather than only the new qualified full-key representation. This suppresses the established human/agent pseudo-icon for ordinary composer mentions.

The unchanged regression contract at desktop/tests/e2e/mentions.spec.ts:994-999,1022-1037 requires that icon and its human-vs-channel alignment. Required job Desktop Smoke E2E (2) failed that assertion on all three attempts at this exact head: expected delta 1, received 6.64844. The same failure was reproduced locally against the exact built head, with the captured composer showing the literal @ treatment but no person icon.

Job: https://github.com/block/buzz/actions/runs/33666290616/job/100369030400

Author action: scope the literal-prefix/no-pseudo-icon styling to qualified full-key decorations, preserving ordinary human/agent mention icon presentation, then rerun the full smoke matrix green.

Repaired behavior verified

  • Historical ambiguous recipients are now filtered against occurrences still owned by replacement content; edit snapshots replace authored mention refs while retaining historical notification tags only as history. Forwarding consumes the latest authoritative snapshot. Causal mutation of this filtering failed 5/14 focused edit tests as expected.
  • Full-key composer and rendered labels now wrap within narrow/zoomed hosts and expose full identity through title/aria-label. The production E2E file passed 16/16, and its focus/menu lifecycle case passed 10/10 repeated.
  • Edit activation now waits for menu exit, asserts editor focus before typing, and preserves Escape focus restoration.
  • Exact-head full Desktop unit suite passed 5,861/5,861 with matching start/end SHA and clean tree. build:e2e and git diff --check passed. The new mention-recipient smoke rows passed in CI; the failure is the ordinary-mention regression above.

Confidence gaps

No native Tauri/live-relay journey or cross-browser accessibility observation was performed. That remains reviewer/release verification, not additional author rework. Desktop Core and two smoke shards were still pending at final sampling; the terminal required failure already blocks this head.

— :bot: Jude’s code review agent

@loganj

loganj commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator Author

Ordinary-icon and thread-readiness repair published

Published exact head e64ebb8bc8b4072bc4c6baf8af7bd13c41b4e268, still based on #7128 at 4fe451d9c251af59c34a0a890d38499912f7e3da.

Addresses review 5093644714: the zero-padding/no-icon/literal-prefix CSS now applies only to explicitly classified full-key decorations. Ordinary human, agent and channel mentions retain their identity icons and existing alignment. Recipient binding, historical alias competition, replacement snapshot/forward authority, prior-delivery-gated automatic addressing and read-only wrapping are unchanged.

The eleven thread-navigation failures had a separate cause: tests filled the old reply input before Radix's delayed edit activation. Tests now observe the actual edit target, original content and focus before typing. They do not force focus, sleep, bypass navigation guards or weaken refusal/retry outcomes; forced Reply clicks were removed. The production onCloseAutoFocus handoff and onItemLeave protection remain unchanged. Held menu-exit/pointer-leave/typing and Escape coverage passes.

Evidence and scope

  • Published seven-file delta is byte-identical to the independently approved frozen repair (SHA-256 53f6fc66dcea7f03295453538ec80204e3f1d7eddc3753cdb151ff8bf794f40c); publication made no source changes.
  • Reused repair validation: full Desktop JS 5,867/5,867, full check/typecheck/file-size, E2E and normal production builds; focused Chromium 33/33, zero retries/skips/flakes/forced actions. The full unit run precedes final E2E/docs-only corrections. An initial helper-argument TypeError was fixed and its failure artifacts retained.
  • Independent review approved the exact frozen delta, verified the preserved authority/focus seams, ran 75/75 focused units and 4/4 Chromium cases, and reused the broad package evidence. This is scoped technical review, not a formal GitHub approval or hosted-green claim.
  • No fresh full local just ci, native Tauri/live-relay, cross-browser or mobile validation is claimed. Prior evidence and confidence limits remain in the PR body.

The new exact-head hosted smoke matrix is now running; the old failed run remains preserved. No inline review threads are unresolved, so none were resolved or dismissed.

@jedwards27 — please perform the established automated re-review of this exact published head, reusing valid unchanged evidence and keeping the full hosted smoke result as an outstanding gate. No merge is requested.

Publisher follow-up: full Desktop JS 5,867/5,867, check/types/file-size/diff passed at committed e64ebb8b with identical clean start/end HEAD. Current hosted CI remains in progress; no full hosted-green claim.

@loganj
loganj requested a review from jedwards27 September 3, 2026 01:41
loganj added a commit that referenced this pull request Sep 3, 2026
🤖

## Summary

In Buzz Desktop, choosing a multi-word name and immediately continuing a
sentence could swallow the space after the mention: `Hey @alice
Chenhello`. This keeps the separator, so the same action produces `Hey
@alice Chen hello` without moving the caret or repairing the name by
hand.

The editor recognizes the complete selected label, including its
internal spaces, and settles the autocomplete caret after the trailing
separator. Deliberately moving left or clicking inside the label still
lets you edit there; this is not a rule that forces every caret to the
end of a mention.

### Related issue

Independent base: `main`. Child:
[#7133](#7133), whose disambiguated
labels also contain spaces. Extracted from
[#7114](#7114), retained as historical
source (`98fe33ec`).

[Behavior
contract](https://github.com/block/buzz/blob/4fe451d9c251af59c34a0a890d38499912f7e3da/docs/mention-editor.md).
Originating [Buzz
discussion](buzz://message?channel=f7a9536a-1738-4bad-a888-b3ea25010ef1&id=7aa1f0ab23dce514bd8a0221441cf005bf428914621171472b79747c50820848)
· channel `f7a9536a-1738-4bad-a888-b3ea25010ef1`.

### Testing

Select an existing member named Alice Chen, then type `hello`
immediately. Repeat after ArrowLeft or clicking inside the mention:
typing should follow your chosen caret position.

Mock-browser captures, not live remote-agent evidence:

#### Immediate typing preserves the separator
Choosing the complete label then typing produces `Hey @alice Chen
hello`.


![separator](https://raw.githubusercontent.com/block/buzz/7258fe2d9f276b93f4d304ac2ac47c450f104157/pr-7128--separator.png)

#### Deliberate caret movement is respected
After ArrowLeft, typing edits at the chosen caret rather than forcing
the caret back beyond the separator.


![intentional-caret](https://raw.githubusercontent.com/block/buzz/7258fe2d9f276b93f4d304ac2ac47c450f104157/pr-7128--intentional-caret.png)

[Original screenshot
publication](#7128 (comment));
immutable image URLs and captions retained here.

#### Evidence and limitations

**5,801 desktop tests**, **45 focused editor tests**, both new browser
regressions, the browser-test build and static/type/size checks passed.
[Applicable CI
passed](https://github.com/block/buzz/actions/runs/33421534320).

The broader browser run had **132 passes / 6 failures**: two
clipboard-origin setup failures and four generic caret-formatting
failures also reproduced on unchanged main. Full local `just ci` stopped
at three native timing/probe failures; a same-head native rerun passed
**3,005 tests** with 18 existing ignores. This is not a full local-CI
pass. The change fixes insertion and caret behavior, not duplicate-name
recipient selection, discovery or invitation.

Signed-off-by: Logan Johnson <loganj@squareup.com>
Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz>
Base automatically changed from fix/mention-spacing-split to main September 3, 2026 01:51

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review verdict: request changes

Re-reviewed base 44d19f59a593dfb541bf40dcadbed313ca4a8f97 through exact live head e64ebb8bc8b4072bc4c6baf8af7bd13c41b4e268. The recipient-identity and visible mention-UX repairs now hold, but this head causes two terminal failures in a required Desktop smoke shard.

Two reply/edit journeys cannot open Reply

At desktop/tests/e2e/messaging.spec.ts:3824 and :3911, this head changes the initial Reply interactions from .click({ force: true }) to ordinary .click(). In both affected journeys, the Reply control is rendered, visible, and enabled, but the message-row/composer dock intercepts pointer events until Playwright's 30-second timeout:

  • closing a thread while editing a reply preserves the typed edit
  • main ArrowUp refuses to replace a dirty thread edit

Both failures were reproduced locally and occur before either journey reaches the new edit-readiness or mention-identity assertions. Adjacent equivalent Reply journeys still use forced clicks. Required Desktop Smoke E2E (3) consequently ended with 275 passed, 1 skipped, 2 flaky-but-passed, and 2 terminal failures.

Job: https://github.com/block/buzz/actions/runs/33704606602/job/100491092843

Author action: restore a reliable initial Reply-opening interaction in both journeys—most directly reinstate { force: true }, or deliberately make a real click unobstructed—while retaining the new expectReplyEditReady checks. Rerun the full Desktop Smoke E2E gate.

Repaired behavior verified

  • Exact recipient references remain stable through selection, replacement edits, authoritative edit snapshots, overlay, and forwarding; stale original p tags are not revived, and qualified agent-address tags are filtered against notified recipients.
  • Ordinary human mentions again show the shared person icon and agents retain bot treatment.
  • Qualified-label wrapping/disclosure, editor focus/caret, keyboard behavior, and narrow/zoom composer → sent → reopen coverage passed focused validation.
  • Desktop package suite passed 5,867/5,867; Desktop E2E build/typecheck passed. Desktop Core, smoke shards 1/2/4, relay E2E, both integration shards, macOS build, and security checks were green at this exact head.

Confidence gaps and ownership

  • The qualified-label wrapping assertion initially measured one fragment rather than two, then passed on retry. This is a stability confidence gap, not the terminal gate cause. Owner: author/CI follow-up.
  • GitHub reports mergeable=CONFLICTING, mergeStateStatus=DIRTY. Conflict presence alone is not a demonstrated product defect, but post-resolution compatibility is unproven. Owner: author to resolve/rebase without dropping mention-snapshot and forwarding semantics; reviewer to recheck the resulting exact head.
  • No native Tauri/live-relay journey or cross-browser accessibility observation was performed. Owner: native/release verification if required; no additional author rework is requested on that basis.

— :bot: Jude’s code review agent

@loganj
loganj force-pushed the fix/mention-recipients-split branch from e64ebb8 to 886ae4b Compare September 3, 2026 03:55
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

🔐 Codex Security Review

Status: review required for the current range.

The current range is cd02b693aae86444b0b5636474a3d202c6fc8f26...0b3b18c04c934f81cb4bd3ce1832836eae48188f.
A new review must complete for this exact range. When manual authorization
is required, a Block organization member must comment exactly
@buzz-security-review 0b3b18c04c934f81cb4bd3ce1832836eae48188f to authorize a new review.
Any previous review applies only to its recorded range.

@loganj

loganj commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator Author

Rebased repair — 886ae4bbb68e28e8d44a1144ad99892acdf735fe

Resolved the actual main conflicts without dropping the exact-recipient, replacement-snapshot, forwarding, or delayed Edit-focus safeguards. Main's cloud provenance and authored-mention unpin behavior are preserved.

  • Both reported Reply-opening failures now wait for the root message, settled animations, and unobstructed row visibility before a normal click. expectReplyEditReady remains in place; no force-click bypass.
  • Full-key literal CSS now matches the specificity of main's ordinary inline icon rule. Ordinary human/agent/channel icons remain inline; qualified full keys show their literal prefix and wrap without cloned padding/pseudo-icons.
  • Automatic-audience regressions run in threads, matching main's thread-only persistence. Delete/address-chip removal excludes A and keeps B; picker unpin retains authored A without retaining its pin. Exact recipients are asserted at the actual thread IPC send boundary (root flows still use signed-event capture).

Validation

The committed reconciliation delta is byte-identical to the locally validated candidate. Full Desktop JS: 6,084/6,084, zero skipped/failing. Related Chromium suite: 228/228, zero skips/retries/flakes, against a separate fixed E2E bundle built from the reconciled source. Includes the two Reply journeys, mention identity/removal/edit/forwarding, ordinary icons, cloud/profiles, and narrow/zoom layouts. Desktop check/typecheck, E2E build, differential file-size gate pass. Native cargo check passed before the later CSS/test-only edits.

Initial browser failures and the earlier broad run invalidated by a concurrent production build are retained locally, not counted as a green gate. Desktop check initially failed on formatting of the untracked local Playwright config; formatting that config cleared the package check. Unit/source tree evidence predates this commit; the exact patch bytes were checked at commit. Layout screenshots at 800×900/150% show the full key within composer and sent-card bounds with ordinary bot icon intact; these are mock Chromium, not native/accessibility certification.

Outstanding: full Desktop smoke gate and fresh exact-head review. No full just ci, native/live-relay workflow, cross-browser, or merge-ready claim. No merge requested. The prior formal review remains intact; there are no unresolved inline review threads in the earlier snapshot.

@jedwards27 — please perform the established automated re-review of this exact head, including the Reply fixes and post-rebase composer compatibility. Reuse valid unchanged evidence; retain hosted smoke as a gate.

@loganj
loganj requested a review from jedwards27 September 3, 2026 03:55

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:bot: Jude’s code review agent — APPROVE at exact head 886ae4bbb68e28e8d44a1144ad99892acdf735fe against base 5073e075d7e7d95558c57f24d86d5db6196491c4.

No unresolved author-actionable defect was found in the changed-head re-review.

What I verified:

  • Exact recipient identity remains pubkey-bound through duplicate-name selection, edit/reopen, rendering, forwarding, and send-to-channel. Explicit selections and authoritative edited-recipient snapshots are not re-resolved from ambiguous display labels.
  • Save/send boundaries revalidate eligibility and membership, including the explicit send-without-inviting path; I found no label-based cross-community authorization path in the reviewed recipient call chain.
  • Recipient E2E passed 17/17, including edit/reopen, forwarding, absent-roster overlap, ambiguous historical names, focus/menu lifecycle, and narrow/1.5x zoom behavior.
  • Both repaired Reply journeys pass with ordinary clicks locally and in hosted exact-head job 100516725335 (run 33713118177).
  • Focus transfer, keyboard input, caret adjacency, accessibility-oriented menu behavior, ordinary mention icons, qualified-key disclosure/wrapping, and composer → sent → reopen behavior passed the focused UI coverage.
  • Desktop units passed 6,084/6,084; typecheck, repository checks, file-size gate, and diff check passed in the exact-head review worktrees.

Outstanding confidence gaps, not PR defects:

  • Required Desktop CI remains red because smoke shard 3 terminates on message-feedback-snapshots.spec.ts:97 (profile-hover alpha mismatch). That test and the sampled profile-hover implementation/style are outside the base→head changed-file set. Current evidence does not support author rework; rerun/triage belongs to the Desktop required-gate owner.
  • persistent-agent-audience.spec.ts:537 failed twice and passed retry in that shard. The unchanged row passed 10/10 under CI settings at both exact head and base, so current evidence does not establish a PR-caused regression. Retain it for gate-owner comparison on rerun.
  • Native Tauri/OS-delivered input was not exercised; browser E2E covers the production React/CSS seam but not native WKWebView input delivery. This is routed release verification, not author action.

Any new head invalidates this approval.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:bot: Jude’s code review agent

Verdict: APPROVE

Reviewed: 5073e075d7e7d95558c57f24d86d5db6196491c4..886ae4bbb68e28e8d44a1144ad99892acdf735fe (exact head 886ae4bbb68e28e8d44a1144ad99892acdf735fe)

Risk: high — this changes exact mention-recipient identity across composer selection, edits/reopen, rendered references, forwarding, and send-time admission, plus shared interaction/CSS behavior.

Behavior/contracts traced: renderer recipient ownership by pubkey; ambiguous and absent-roster history; authoritative edit snapshots; overlay/reopen/forwarding semantics; membership and eligibility revalidation; ordinary versus qualified mention presentation; Radix menu focus handoff; normal Reply hit targets; narrow/zoom wrapping; Desktop gate selection.

Findings: no unresolved author-actionable defect. The prior stale-recipient forwarding, qualified-label wrapping, editor-focus, ordinary-icon, and Reply-interaction findings are repaired at this head.

Both assigned review lanes independently reached the same result:

  • Systems/integration traced selection → save → authorized edit snapshot → overlay/reopen → forwarding/send-to-channel. Recipient identity remains pubkey-bound rather than label-re-resolved; current additions are revalidated at save/send boundaries; stale original notification tags do not regain forwarding authority. The rebased conflict resolution preserves these contracts.
  • Product/UI/adversarial validation found ordinary person/agent/channel icons and qualified full-key wrapping coexist, Radix Edit transfers focus correctly while Escape restores the trigger, and composer → sent → reopen remains bounded at 100% and 150% text scaling.

Author action: none.

Verification owner: reviewer/tooling for the outstanding unrelated smoke failure and native/cross-browser confidence gaps; CI/release gate retains its normal merge-gate authority.

Validation at matching clean head:

  • Desktop unit package: 6,084/6,084 passed.
  • mention-recipients.spec.ts: 17/17 passed.
  • Focused product journeys: 9/9 passed.
  • Previously failing Reply journeys: 2/2 passed locally and both passed in hosted exact-head job 100516725335.
  • pnpm typecheck, pnpm check, file-size gate, and git diff --check: passed.
  • Hosted exact-head CI: Desktop Core, smoke shards 1/2/4, Desktop E2E integration/relay, macOS build, and Windows build passed.

Manual/native evidence: mock-Chromium screenshots for composer/sent/reopen at 800×900 and 100%/150% were inspected; labels remained inside their hosts and ordinary icons remained intact. No native Tauri/WKWebView or cross-browser journey was run.

Residual risk / external gate: required Desktop is currently red because smoke shard 3 failed message-feedback-snapshots.spec.ts:97 on a transient hover-alpha snapshot; that spec and the sampled profile-card implementation/style are outside this PR’s base-to-head changed-file set. The same shard also retried persistent-agent-audience.spec.ts:537 before passing; that unchanged row passed 10/10 at both exact head and base in comparative runs. Neither result establishes a PR-caused author defect, so they remain CI/tooling-owned confidence gaps rather than a reason to request changes. Native/live-relay and cross-browser accessibility observation also remain outstanding.

This was referenced Sep 5, 2026
baxen pushed a commit that referenced this pull request Sep 5, 2026
* origin/main:
  fix(desktop): keep packaged frontendDist relative so Windows embeds assets (#7177)
  fix(sidebar): simplify unread indicators and emphasize priority activity (#7134)
  Add generic information-flow control core (#7293)
  feat(buzz-acp): update base prompt; add buzz context and skills to Pi agents (#7335)
  fix(desktop): restore mention chip identity icons (#7338)
  Persist video playback speed preference (#7336)
  Verify ACP relay events before prompt routing (#7010)
  fix(buzz-acp): bound busy-owner hold to prevent cross-channel starvation (#7337)
  feat(desktop): invite owned agents from standalone forums (#7125)
  fix(desktop): authorize remote mentions at publication (#7124)
  fix(acp): rename system tag to agent-instructions (#7332)
  fix(desktop): bind duplicate mention selections to exact recipients (#7133)
  refactor(relay): extract NIP-29 membership authorization (#7285)
  chore(release): release Buzz Desktop version 0.5.22 (#7308)
  feat(desktop): preserve mentions across copy and paste (#7228)
  test(desktop): await Bestie drag and profile hover endpoints (#7294)

Signed-off-by: Fizz <400e8babadcee6a7f420103f10a2849d84c4a9c71d5bd04f3948c814216648a3@buzz.block.builderlab.xyz>
wpfleger96 pushed a commit that referenced this pull request Sep 8, 2026
* origin/main:
  chore(release): release Buzz Desktop version 0.5.23 (#7381)
  fix(desktop): keep packaged frontendDist relative so Windows embeds assets (#7177)
  fix(sidebar): simplify unread indicators and emphasize priority activity (#7134)
  Add generic information-flow control core (#7293)
  feat(buzz-acp): update base prompt; add buzz context and skills to Pi agents (#7335)
  fix(desktop): restore mention chip identity icons (#7338)
  Persist video playback speed preference (#7336)
  Verify ACP relay events before prompt routing (#7010)
  fix(buzz-acp): bound busy-owner hold to prevent cross-channel starvation (#7337)
  feat(desktop): invite owned agents from standalone forums (#7125)
  fix(desktop): authorize remote mentions at publication (#7124)
  fix(acp): rename system tag to agent-instructions (#7332)
  fix(desktop): bind duplicate mention selections to exact recipients (#7133)
  refactor(relay): extract NIP-29 membership authorization (#7285)
  chore(release): release Buzz Desktop version 0.5.22 (#7308)
  feat(desktop): preserve mentions across copy and paste (#7228)
  test(desktop): await Bestie drag and profile hover endpoints (#7294)

Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
wpfleger96 pushed a commit that referenced this pull request Sep 8, 2026
…-enforcement

* origin/main:
  Add generic information-flow control core (#7293)
  feat(buzz-acp): update base prompt; add buzz context and skills to Pi agents (#7335)
  fix(desktop): restore mention chip identity icons (#7338)
  Persist video playback speed preference (#7336)
  Verify ACP relay events before prompt routing (#7010)
  fix(buzz-acp): bound busy-owner hold to prevent cross-channel starvation (#7337)
  feat(desktop): invite owned agents from standalone forums (#7125)
  fix(desktop): authorize remote mentions at publication (#7124)
  fix(acp): rename system tag to agent-instructions (#7332)
  fix(desktop): bind duplicate mention selections to exact recipients (#7133)
  refactor(relay): extract NIP-29 membership authorization (#7285)
  chore(release): release Buzz Desktop version 0.5.22 (#7308)
  feat(desktop): preserve mentions across copy and paste (#7228)
  test(desktop): await Bestie drag and profile hover endpoints (#7294)
  Collapse contiguous join messages (#7262)
  chore(release): release Buzz Desktop version 0.5.21 (#7301)
  fix(scripts): copy global-agent-config.json in buzz-adopt-prod-agents (#7303)

Signed-off-by: Hayt <9e1c23a3fd83f61da34420e4e88ff1b16e45cafcc0cd9019eb07d4ecfa8ca9b0@buzz.block.builderlab.xyz>
wpfleger96 added a commit that referenced this pull request Sep 8, 2026
…n-surface

* origin/main: (23 commits)
  chore(release): release Buzz Desktop version 0.5.23 (#7381)
  fix(desktop): keep packaged frontendDist relative so Windows embeds assets (#7177)
  fix(sidebar): simplify unread indicators and emphasize priority activity (#7134)
  Add generic information-flow control core (#7293)
  feat(buzz-acp): update base prompt; add buzz context and skills to Pi agents (#7335)
  fix(desktop): restore mention chip identity icons (#7338)
  Persist video playback speed preference (#7336)
  Verify ACP relay events before prompt routing (#7010)
  fix(buzz-acp): bound busy-owner hold to prevent cross-channel starvation (#7337)
  feat(desktop): invite owned agents from standalone forums (#7125)
  fix(desktop): authorize remote mentions at publication (#7124)
  fix(acp): rename system tag to agent-instructions (#7332)
  fix(desktop): bind duplicate mention selections to exact recipients (#7133)
  refactor(relay): extract NIP-29 membership authorization (#7285)
  chore(release): release Buzz Desktop version 0.5.22 (#7308)
  feat(desktop): preserve mentions across copy and paste (#7228)
  test(desktop): await Bestie drag and profile hover endpoints (#7294)
  Collapse contiguous join messages (#7262)
  chore(release): release Buzz Desktop version 0.5.21 (#7301)
  fix(scripts): copy global-agent-config.json in buzz-adopt-prod-agents (#7303)
  ...

Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
brow added a commit that referenced this pull request Sep 8, 2026
* origin/main: (29 commits)
  fix(acp): pace targeted overflow recovery on consumer capacity (#7325)
  fix(link-preview): keep composer fetches user-paced (#7211)
  feat(mesh): upgrade to mesh-llm 0.76.0-rc8 and recommend Qwen3.8 27B (#6189)
  fix(agent): route GPT-5+ model-service FQNs to Responses (#7358)
  fix(buzz-acp): wake held ACP threads and fence forked sessions (#7340)
  fix(mobile): style inline code with the app mono face (#6631)
  chore(release): release Buzz Desktop version 0.5.23 (#7381)
  fix(desktop): keep packaged frontendDist relative so Windows embeds assets (#7177)
  fix(sidebar): simplify unread indicators and emphasize priority activity (#7134)
  Add generic information-flow control core (#7293)
  feat(buzz-acp): update base prompt; add buzz context and skills to Pi agents (#7335)
  fix(desktop): restore mention chip identity icons (#7338)
  Persist video playback speed preference (#7336)
  Verify ACP relay events before prompt routing (#7010)
  fix(buzz-acp): bound busy-owner hold to prevent cross-channel starvation (#7337)
  feat(desktop): invite owned agents from standalone forums (#7125)
  fix(desktop): authorize remote mentions at publication (#7124)
  fix(acp): rename system tag to agent-instructions (#7332)
  fix(desktop): bind duplicate mention selections to exact recipients (#7133)
  refactor(relay): extract NIP-29 membership authorization (#7285)
  ...

Signed-off-by: Tom Brow <tomb@block.xyz>
rileycrane pushed a commit that referenced this pull request Sep 8, 2026
* origin/main: (77 commits)
  fix(acp): pace targeted overflow recovery on consumer capacity (#7325)
  fix(link-preview): keep composer fetches user-paced (#7211)
  feat(mesh): upgrade to mesh-llm 0.76.0-rc8 and recommend Qwen3.8 27B (#6189)
  fix(agent): route GPT-5+ model-service FQNs to Responses (#7358)
  fix(buzz-acp): wake held ACP threads and fence forked sessions (#7340)
  fix(mobile): style inline code with the app mono face (#6631)
  chore(release): release Buzz Desktop version 0.5.23 (#7381)
  fix(desktop): keep packaged frontendDist relative so Windows embeds assets (#7177)
  fix(sidebar): simplify unread indicators and emphasize priority activity (#7134)
  Add generic information-flow control core (#7293)
  feat(buzz-acp): update base prompt; add buzz context and skills to Pi agents (#7335)
  fix(desktop): restore mention chip identity icons (#7338)
  Persist video playback speed preference (#7336)
  Verify ACP relay events before prompt routing (#7010)
  fix(buzz-acp): bound busy-owner hold to prevent cross-channel starvation (#7337)
  feat(desktop): invite owned agents from standalone forums (#7125)
  fix(desktop): authorize remote mentions at publication (#7124)
  fix(acp): rename system tag to agent-instructions (#7332)
  fix(desktop): bind duplicate mention selections to exact recipients (#7133)
  refactor(relay): extract NIP-29 membership authorization (#7285)
  ...

Signed-off-by: Sol <478bb5a31222ea2b28a3d1afb8b1d598940628f19c2a87efc3c4b822299eeec6@buzz.block.builderlab.xyz>

# Conflicts:
#	desktop/src-tauri/src/commands/media_download.rs
#	desktop/src-tauri/src/lib.rs
ranjank2alpha pushed a commit to ranjank2alpha/buzz that referenced this pull request Sep 9, 2026
Merge desktop-v0.5.23 into the 0.5.22-2 base; 12 conflicts resolved.
Adopt upstream's official frontendDist fix (block#7177), retiring the fork
workaround. Keep fork features: @channel/@here scope in useMentions,
MessageTimeline providers + pinned intro, MessageRow onUnpin. Adopt
upstream mention overhaul (block#7133, block#7228, block#7338), sidebar unread
simplification (block#7134), and join-message collapse. Version 0.5.23-1.

Signed-off-by: ashish <ashishkaran@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants